﻿using System;
using System.Threading;

// 事件类型枚举
public enum EventType
{
    Tick,
    Alarm
}

// 事件参数类
public class AlarmEventArgs : EventArgs
{
    public EventType Type { get; }
    public string Message { get; }
    public DateTime Time { get; }

    public AlarmEventArgs(EventType type, string message)
    {
        Type = type;
        Message = message;
        Time = DateTime.Now;
    }
}

// 闹钟类
public class AlarmClock
{
    // 定义事件（使用泛型EventHandler<T>）
    public event EventHandler<AlarmEventArgs> OnClockEvent;

    private Timer _timer;
    private DateTime _alarmTime;
    private bool _isAlarmSet;

    public AlarmClock()
    {
        // 使用Timer来模拟时钟滴答
        _timer = new Timer(Tick, null, 0, 1000); // 每秒触发一次
    }

    // 设置闹钟
    public void SetAlarm(int secondsFromNow)
    {
        _alarmTime = DateTime.Now.AddSeconds(secondsFromNow);
        _isAlarmSet = true;
        Console.WriteLine($"闹钟已设置，将在 {secondsFromNow} 秒后响铃");
    }

    // 停止闹钟
    public void Stop()
    {
        _timer?.Dispose();
        Console.WriteLine("闹钟已停止");
    }

    // 定时器回调方法
    private void Tick(object state)
    {
        var now = DateTime.Now;

        // 触发Tick事件
        OnClockEvent?.Invoke(this, new AlarmEventArgs(
            EventType.Tick,
            $"嘀嗒... 当前时间: {now.ToString("HH:mm:ss")}"
        ));

        // 检查是否到闹铃时间
        if (_isAlarmSet && now >= _alarmTime)
        {
            OnClockEvent?.Invoke(this, new AlarmEventArgs(
                EventType.Alarm,
                "叮铃铃!!! 时间到了，该起床了!!!"
            ));
            _isAlarmSet = false; // 只响一次
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建闹钟实例
        var alarmClock = new AlarmClock();

        // 订阅事件
        alarmClock.OnClockEvent += OnTick;
        alarmClock.OnClockEvent += OnAlarm;

        // 设置10秒后响铃
        alarmClock.SetAlarm(10);

        Console.WriteLine("闹钟运行中... (按任意键退出)");
        Console.ReadKey();

        alarmClock.Stop();
    }

    // Tick事件处理程序
    private static void OnTick(object sender, AlarmEventArgs e)
    {
        if (e.Type == EventType.Tick)
        {
            Console.WriteLine(e.Message);
        }
    }

    // Alarm事件处理程序
    private static void OnAlarm(object sender, AlarmEventArgs e)
    {
        if (e.Type == EventType.Alarm)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(e.Message);
            Console.ResetColor();
        }
    }
}